library(readxl)
library(readr)
library(dplyr)
library(here)
library(tidyverse)
library(stringr)

Read in xlsx file

sheet1 <- read_xlsx(here("raw_data/boing-boing-candy-2015.xlsx"))
sheet1

Inspect the data i.e. dimensions, variable types, variable names, etc.?

dim(sheet1)
colnames(sheet1)
glimpse(sheet1)

Tidy data - long format

sheet1_long <- sheet1 %>%
  pivot_longer(cols = starts_with("["),  #converting rows to columns 
               names_to = "candy",
               values_to = "rating")

#check dimensions, column names
dim(sheet1_long)
colnames(sheet1_long)

#Omitting columns that are not required

sheet1_long <- sheet1_long %>%
  select(-c(4:29))

colnames(sheet1_long)
dim(sheet1_long)
colnames(sheet1_long) <- c("timestamp", "age", "going_out", "candy", "rating")
colnames(sheet1_long)
[1] "timestamp" "age"       "going_out" "candy"     "rating"   

#Add column ‘year’

sheet1_long <- sheet1_long %>%
  add_column(year = 2015)
head(sheet1_long)

Read in xlsx file

sheet2 <- read_xlsx(here("raw_data/boing-boing-candy-2016.xlsx"))
sheet2

Inspect the data i.e. dimensions, variable types, variable names, etc.?

dim(sheet2)
colnames(sheet2)
glimpse(sheet2)

Tidy data - long format

sheet2_long <- sheet2 %>%
  pivot_longer(cols = starts_with("["),  #converting rows to columns 
               names_to = "candy",
               values_to = "rating")

dim(sheet2_long)
colnames(sheet2_long)

#Omitting columns that are not required

sheet2_long <- sheet2_long %>%
  select(-c(6:22))

colnames(sheet2_long)
[1] "Timestamp"                                                "Are you going actually going trick or treating yourself?"
[3] "Your gender:"                                             "How old are you?"                                        
[5] "Which country do you live in?"                            "candy"                                                   
[7] "rating"                                                  
dim(sheet2_long)
[1] 127159      7
colnames(sheet2_long) <- c("timestamp", "going_out", "gender", "age", "country", "candy", "rating")
colnames(sheet2_long)
[1] "timestamp" "going_out" "gender"    "age"       "country"   "candy"     "rating"   

#Add column ‘year’

sheet2_long <- sheet2_long %>%
  add_column(year = 2016)
head(sheet2_long)
distinct(sheet2_long, country)

Read in xlsx file

sheet3 <- read_xlsx(here("raw_data/boing-boing-candy-2017.xlsx"))
New names:
* `` -> ...114
sheet3

Inspect the data i.e. dimensions, variable types, variable names, etc.?

dim(sheet3)
colnames(sheet3)
glimpse(sheet3)

Tidy data - long format

sheet3_long <- sheet3 %>%
  pivot_longer(cols = starts_with("Q6"),  #converting rows to columns 
               names_to = "candy",
               values_to = "rating")
colnames(sheet3_long)
 [1] "Internal ID"                      "Q1: GOING OUT?"                   "Q2: GENDER"                       "Q3: AGE"                         
 [5] "Q4: COUNTRY"                      "Q5: STATE, PROVINCE, COUNTY, ETC" "Q7: JOY OTHER"                    "Q8: DESPAIR OTHER"               
 [9] "Q9: OTHER COMMENTS"               "Q10: DRESS"                       "...114"                           "Q11: DAY"                        
[13] "Q12: MEDIA [Daily Dish]"          "Q12: MEDIA [Science]"             "Q12: MEDIA [ESPN]"                "Q12: MEDIA [Yahoo]"              
[17] "Click Coordinates (x, y)"         "candy"                            "rating"                          

#Omitting columns that are not required

sheet3_long <- sheet3_long %>%
  select(-c(6:17))
colnames(sheet3_long)
[1] "Internal ID"    "Q1: GOING OUT?" "Q2: GENDER"     "Q3: AGE"        "Q4: COUNTRY"    "candy"          "rating"        
dim(sheet3_long)
[1] 253380      7

#Change col names

colnames(sheet3_long) <- c("internal_id", "going_out", "gender", "age", "country", "candy", "rating")
colnames(sheet3_long)
[1] "internal_id" "going_out"   "gender"      "age"         "country"     "candy"       "rating"     
sheet3_long
#summarise((count = sum(is.na(rating))))

#Add column ‘year’

sheet3_long <- sheet3_long %>%
  add_column(year = 2017)
head(sheet3_long)
distinct(sheet3_long, country)

#X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

Combine all sheets


candy_combined <- bind_rows(sheet1_long, sheet2_long, sheet3_long)

colnames(candy_combined)
[1] "timestamp"   "age"         "going_out"   "candy"       "rating"      "year"        "gender"      "country"     "internal_id"
dim(candy_combined)
[1] 915389      9
head(candy_combined)

#check

distinct(candy_combined, going_out)

#Changing column data type

candy_combined$age <- as.integer(candy_combined$age)
NAs introduced by coercionNAs introduced by coercion to integer range
candy_combined$year <- as.integer(candy_combined$year)
candy_combined$internal_id <- as.integer(candy_combined$internal_id)
head(candy_combined)
NA

remove age greater than 122

candy_combined <- candy_combined %>%
  filter(age <= 122)

length(candy_combined$age)
[1] 869160
distinct(candy_combined, age)

Change string values to lower case

candy_combined <- candy_combined %>%
  mutate_if(is.character, str_to_lower)

head(candy_combined)
unique(candy_combined$country)
  [1] NA                                                                    
  [2] "canada"                                                              
  [3] "usa"                                                                 
  [4] "us"                                                                  
  [5] "uk"                                                                  
  [6] "united states of america"                                            
  [7] "japan"                                                               
  [8] "united states"                                                       
  [9] "france"                                                              
 [10] "ussa"                                                                
 [11] "u.s.a."                                                              
 [12] "england"                                                             
 [13] "switzerland"                                                         
 [14] "murica"                                                              
 [15] "united kingdom"                                                      
 [16] "neverland"                                                           
 [17] "usa!"                                                                
 [18] "korea"                                                               
 [19] "u.s."                                                                
 [20] "america"                                                             
 [21] "units states"                                                        
 [22] "belgium"                                                             
 [23] "croatia"                                                             
 [24] "portugal"                                                            
 [25] "usa usa usa"                                                         
 [26] "the best one - usa"                                                  
 [27] "usa! usa! usa!"                                                      
 [28] "españa"                                                              
 [29] "there isn't one for old men"                                         
 [30] "panama"                                                              
 [31] "the yoo ess of aaayyyyyy"                                            
 [32] "united kindom"                                                       
 [33] "hungary"                                                             
 [34] "austria"                                                             
 [35] "new zealand"                                                         
 [36] "germany"                                                             
 [37] "mexico"                                                              
 [38] "australia"                                                           
 [39] "brasil"                                                              
 [40] "god's country"                                                       
 [41] "south korea"                                                         
 [42] "usa!!!!!!"                                                           
 [43] "philippines"                                                         
 [44] "eua"                                                                 
 [45] "usa! usa!"                                                           
 [46] "sweden"                                                              
 [47] "united sates"                                                        
 [48] "the netherlands"                                                     
 [49] "finland"                                                             
 [50] "merica"                                                              
 [51] "china"                                                               
 [52] "kenya"                                                               
 [53] "the republic of cascadia"                                            
 [54] "united stetes"                                                       
 [55] "usa usa usa usa"                                                     
 [56] "united  states of america"                                           
 [57] "netherlands"                                                         
 [58] "united state"                                                        
 [59] "united staes"                                                        
 [60] "uae"                                                                 
 [61] "usausausa"                                                           
 [62] "unhinged states"                                                     
 [63] "us of a"                                                             
 [64] "unites states"                                                       
 [65] "the united states"                                                   
 [66] "north carolina"                                                      
 [67] "unied states"                                                        
 [68] "europe"                                                              
 [69] "earth"                                                               
 [70] "u s"                                                                 
 [71] "u.k."                                                                
 [72] "costa rica"                                                          
 [73] "the united states of america"                                        
 [74] "unite states"                                                        
 [75] "cascadia"                                                            
 [76] "greece"                                                              
 [77] "usa? hard to tell anymore.."                                         
 [78] "'merica"                                                             
 [79] "usas"                                                                
 [80] "pittsburgh"                                                          
 [81] "a"                                                                   
 [82] "can"                                                                 
 [83] "canae"                                                               
 [84] "new york"                                                            
 [85] "trumpistan"                                                          
 [86] "ireland"                                                             
 [87] "california"                                                          
 [88] "south africa"                                                        
 [89] "i pretend to be from canada, but i am really from the united states."
 [90] "iceland"                                                             
 [91] "canada`"                                                             
 [92] "scotland"                                                            
 [93] "denmark"                                                             
 [94] "united stated"                                                       
 [95] "ud"                                                                  
 [96] "new jersey"                                                          
 [97] "indonesia"                                                           
 [98] "united ststes"                                                       
 [99] "united statss"                                                       
[100] "endland"                                                             
[101] "murrika"                                                             
[102] "usaa"                                                                
[103] "soviet canuckistan"                                                  
[104] "n. america"                                                          
[105] "singapore"                                                           
[106] "taiwan"                                                              
[107] "hong kong"                                                           
[108] "spain"                                                               
[109] "narnia"                                                              
[110] "u s a"                                                               
[111] "united statea"                                                       
[112] "1"                                                                   
[113] "usa usa usa!!!!"                                                     
[114] "i don't know anymore"                                                
country_distinct <- distinct(candy_combined, country)

Cleaning candy column

candy_combined <- candy_combined %>%
  mutate(candy = str_extract(candy, "[^\\[\\]]+"),
         candy = str_extract(candy, "[^q6 |]+[^|]+"))
  
  

#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

1.4.2 Analysis questions 1. What is the total number of candy ratings given across the three years. (number of candy ratings, not number of raters. Don’t count missing values)

candy_combined %>%
  filter(!is.na(rating)) %>%
  summarise(total_rating_count = n())

#total_candy_ratings
  1. What was the average age of people who are going out trick or treating and the average age of people not going trick or treating?
candy_combined %>%
  select(going_out, age) %>%
  filter(!is.na(going_out)) %>%
  group_by(going_out) %>%
  summarise(average_age = mean(age))
`summarise()` ungrouping output (override with `.groups` argument)
  1. For each of joy, despair and meh, which candy bar revived the most of these ratings?
candy_combined %>%
  select(candy, rating) %>%
  filter(!is.na(rating)) %>%
  group_by(rating, candy) %>%
  summarise(count = n()) %>%
  arrange(desc(count)) %>%
  slice(seq_len(1))
`summarise()` regrouping output by 'rating' (override with `.groups` argument)
distinct(candy_combined, candy)
  1. How many people rated Starburst as despair?
candy_combined %>%
  select(candy, rating) %>%
  filter(candy == "starburst", rating == "despair") %>%
  group_by(rating) %>%
  summarise(starburst_count = n()) #%>%
`summarise()` ungrouping output (override with `.groups` argument)
  #arrange(desc(count)) #%>%
  #slice(seq_len(3))

For the next three questions, count despair as -1, joy as +1 and meh as 0.

  1. What was the most popular candy bar by this rating system for each gender in the dataset?
candy_combined %>%
  select(gender, candy, rating) %>%
  filter(!is.na(rating)) %>%
  mutate(new_rating = case_when(rating == "despair" ~ -1,
                                rating == "joy" ~ 1,
                                rating == "meh" ~ 0,)) %>%
  group_by(gender, candy) %>%
  summarise(count_popular = sum(new_rating)) %>%
  arrange(desc(count_popular)) %>%
  slice(seq_len(1))
`summarise()` regrouping output by 'gender' (override with `.groups` argument)
  1. What was the most popular candy bar in each year?
candy_combined %>%
  select(year, candy, rating) %>%
  filter(!is.na(rating)) %>%
  mutate(new_rating = case_when(rating == "despair" ~ -1,
                                rating == "joy" ~ 1,
                                rating == "meh" ~ 0,)) %>%
  group_by(year, candy) %>%
  summarise(popular_candy = sum(new_rating)) %>%
  arrange(desc(popular_candy)) %>%
  slice(seq_len(1))
`summarise()` regrouping output by 'year' (override with `.groups` argument)
  1. What was the most popular candy bar by this rating for people in US, Canada, UK and all other countries?

TEST XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

sheet3_long %>%
  mutate(new_candy3= str_extract(candy, "[^Q6 |]+[^|]+"))
new_candy3
Error: object 'new_candy3' not found
sheet2_long %>%
  mutate(new_candy2 = str_extract(candy, "[^\\[\\]]+"))
new_candy2
Error: object 'new_candy2' not found
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHN0cmluZ3IpCmBgYAoKIyBSZWFkIGluIHhsc3ggZmlsZQoKYGBge3J9CnNoZWV0MSA8LSByZWFkX3hsc3goaGVyZSgicmF3X2RhdGEvYm9pbmctYm9pbmctY2FuZHktMjAxNS54bHN4IikpCnNoZWV0MQpgYGAKCiMgSW5zcGVjdCB0aGUgZGF0YSBpLmUuIGRpbWVuc2lvbnMsIHZhcmlhYmxlIHR5cGVzLCB2YXJpYWJsZSBuYW1lcywgZXRjLj8KCmBgYHtyfQpkaW0oc2hlZXQxKQpjb2xuYW1lcyhzaGVldDEpCmdsaW1wc2Uoc2hlZXQxKQpgYGAKCiMgVGlkeSBkYXRhIC0gbG9uZyBmb3JtYXQKCmBgYHtyfQpzaGVldDFfbG9uZyA8LSBzaGVldDEgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgiWyIpLCAgI2NvbnZlcnRpbmcgcm93cyB0byBjb2x1bW5zIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJjYW5keSIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyYXRpbmciKQoKI2NoZWNrIGRpbWVuc2lvbnMsIGNvbHVtbiBuYW1lcwpkaW0oc2hlZXQxX2xvbmcpCmNvbG5hbWVzKHNoZWV0MV9sb25nKQpgYGAKCiNPbWl0dGluZyBjb2x1bW5zIHRoYXQgYXJlIG5vdCByZXF1aXJlZAoKYGBge3J9CnNoZWV0MV9sb25nIDwtIHNoZWV0MV9sb25nICU+JQogIHNlbGVjdCgtYyg0OjI5KSkKCmNvbG5hbWVzKHNoZWV0MV9sb25nKQpkaW0oc2hlZXQxX2xvbmcpCmBgYAoKCmBgYHtyfQpjb2xuYW1lcyhzaGVldDFfbG9uZykgPC0gYygidGltZXN0YW1wIiwgImFnZSIsICJnb2luZ19vdXQiLCAiY2FuZHkiLCAicmF0aW5nIikKY29sbmFtZXMoc2hlZXQxX2xvbmcpCgpgYGAKCiNBZGQgY29sdW1uICd5ZWFyJwoKYGBge3J9CnNoZWV0MV9sb25nIDwtIHNoZWV0MV9sb25nICU+JQogIGFkZF9jb2x1bW4oeWVhciA9IDIwMTUpCmhlYWQoc2hlZXQxX2xvbmcpCmBgYAoKCiMgUmVhZCBpbiB4bHN4IGZpbGUKCmBgYHtyfQpzaGVldDIgPC0gcmVhZF94bHN4KGhlcmUoInJhd19kYXRhL2JvaW5nLWJvaW5nLWNhbmR5LTIwMTYueGxzeCIpKQpzaGVldDIKYGBgCgojIEluc3BlY3QgdGhlIGRhdGEgaS5lLiBkaW1lbnNpb25zLCB2YXJpYWJsZSB0eXBlcywgdmFyaWFibGUgbmFtZXMsIGV0Yy4/CgpgYGB7cn0KZGltKHNoZWV0MikKY29sbmFtZXMoc2hlZXQyKQpnbGltcHNlKHNoZWV0MikKYGBgCgojIFRpZHkgZGF0YSAtIGxvbmcgZm9ybWF0CgpgYGB7cn0Kc2hlZXQyX2xvbmcgPC0gc2hlZXQyICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gc3RhcnRzX3dpdGgoIlsiKSwgICNjb252ZXJ0aW5nIHJvd3MgdG8gY29sdW1ucyAKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiY2FuZHkiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicmF0aW5nIikKCmRpbShzaGVldDJfbG9uZykKY29sbmFtZXMoc2hlZXQyX2xvbmcpCmBgYAoKI09taXR0aW5nIGNvbHVtbnMgdGhhdCBhcmUgbm90IHJlcXVpcmVkCgpgYGB7cn0Kc2hlZXQyX2xvbmcgPC0gc2hlZXQyX2xvbmcgJT4lCiAgc2VsZWN0KC1jKDY6MjIpKQoKY29sbmFtZXMoc2hlZXQyX2xvbmcpCmRpbShzaGVldDJfbG9uZykKYGBgCgoKYGBge3J9CmNvbG5hbWVzKHNoZWV0Ml9sb25nKSA8LSBjKCJ0aW1lc3RhbXAiLCAiZ29pbmdfb3V0IiwgImdlbmRlciIsICJhZ2UiLCAiY291bnRyeSIsICJjYW5keSIsICJyYXRpbmciKQpjb2xuYW1lcyhzaGVldDJfbG9uZykKYGBgCgojQWRkIGNvbHVtbiAneWVhcicKCmBgYHtyfQpzaGVldDJfbG9uZyA8LSBzaGVldDJfbG9uZyAlPiUKICBhZGRfY29sdW1uKHllYXIgPSAyMDE2KQpoZWFkKHNoZWV0Ml9sb25nKQpkaXN0aW5jdChzaGVldDJfbG9uZywgY291bnRyeSkKYGBgCgoKCiMgUmVhZCBpbiB4bHN4IGZpbGUKCgpgYGB7cn0Kc2hlZXQzIDwtIHJlYWRfeGxzeChoZXJlKCJyYXdfZGF0YS9ib2luZy1ib2luZy1jYW5keS0yMDE3Lnhsc3giKSkKc2hlZXQzCmBgYAoKIyBJbnNwZWN0IHRoZSBkYXRhIGkuZS4gZGltZW5zaW9ucywgdmFyaWFibGUgdHlwZXMsIHZhcmlhYmxlIG5hbWVzLCBldGMuPwoKYGBge3J9CmRpbShzaGVldDMpCmNvbG5hbWVzKHNoZWV0MykKZ2xpbXBzZShzaGVldDMpCmBgYAoKIyBUaWR5IGRhdGEgLSBsb25nIGZvcm1hdAoKYGBge3J9CnNoZWV0M19sb25nIDwtIHNoZWV0MyAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IHN0YXJ0c193aXRoKCJRNiIpLCAgI2NvbnZlcnRpbmcgcm93cyB0byBjb2x1bW5zIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJjYW5keSIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyYXRpbmciKQpjb2xuYW1lcyhzaGVldDNfbG9uZykKYGBgCgojT21pdHRpbmcgY29sdW1ucyB0aGF0IGFyZSBub3QgcmVxdWlyZWQKCmBgYHtyfQpzaGVldDNfbG9uZyA8LSBzaGVldDNfbG9uZyAlPiUKICBzZWxlY3QoLWMoNjoxNykpCmNvbG5hbWVzKHNoZWV0M19sb25nKQpkaW0oc2hlZXQzX2xvbmcpCmBgYAoKCiNDaGFuZ2UgY29sIG5hbWVzCgpgYGB7cn0KY29sbmFtZXMoc2hlZXQzX2xvbmcpIDwtIGMoImludGVybmFsX2lkIiwgImdvaW5nX291dCIsICJnZW5kZXIiLCAiYWdlIiwgImNvdW50cnkiLCAiY2FuZHkiLCAicmF0aW5nIikKY29sbmFtZXMoc2hlZXQzX2xvbmcpCgpzaGVldDNfbG9uZwojc3VtbWFyaXNlKChjb3VudCA9IHN1bShpcy5uYShyYXRpbmcpKSkpCmBgYAoKCiNBZGQgY29sdW1uICd5ZWFyJwoKYGBge3J9CnNoZWV0M19sb25nIDwtIHNoZWV0M19sb25nICU+JQogIGFkZF9jb2x1bW4oeWVhciA9IDIwMTcpCmhlYWQoc2hlZXQzX2xvbmcpCmRpc3RpbmN0KHNoZWV0M19sb25nLCBjb3VudHJ5KQpgYGAKCiNYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCAKCiMgQ29tYmluZSBhbGwgc2hlZXRzIAoKYGBge3J9CgpjYW5keV9jb21iaW5lZCA8LSBiaW5kX3Jvd3Moc2hlZXQxX2xvbmcsIHNoZWV0Ml9sb25nLCBzaGVldDNfbG9uZykKCmNvbG5hbWVzKGNhbmR5X2NvbWJpbmVkKQpkaW0oY2FuZHlfY29tYmluZWQpCmhlYWQoY2FuZHlfY29tYmluZWQpCmBgYAoKI2NoZWNrCgpgYGB7cn0KZGlzdGluY3QoY2FuZHlfY29tYmluZWQsIGdvaW5nX291dCkKYGBgCgoKI0NoYW5naW5nIGNvbHVtbiBkYXRhIHR5cGUKCmBgYHtyfQpjYW5keV9jb21iaW5lZCRhZ2UgPC0gYXMuaW50ZWdlcihjYW5keV9jb21iaW5lZCRhZ2UpCmNhbmR5X2NvbWJpbmVkJHllYXIgPC0gYXMuaW50ZWdlcihjYW5keV9jb21iaW5lZCR5ZWFyKQpjYW5keV9jb21iaW5lZCRpbnRlcm5hbF9pZCA8LSBhcy5pbnRlZ2VyKGNhbmR5X2NvbWJpbmVkJGludGVybmFsX2lkKQpoZWFkKGNhbmR5X2NvbWJpbmVkKQoKYGBgCgojIHJlbW92ZSBhZ2UgZ3JlYXRlciB0aGFuIDEyMgoKYGBge3J9CmNhbmR5X2NvbWJpbmVkIDwtIGNhbmR5X2NvbWJpbmVkICU+JQogIGZpbHRlcihhZ2UgPD0gMTIyKQoKbGVuZ3RoKGNhbmR5X2NvbWJpbmVkJGFnZSkKZGlzdGluY3QoY2FuZHlfY29tYmluZWQsIGFnZSkKYGBgCgojIENoYW5nZSBzdHJpbmcgdmFsdWVzIHRvIGxvd2VyIGNhc2UKCmBgYHtyfQpjYW5keV9jb21iaW5lZCA8LSBjYW5keV9jb21iaW5lZCAlPiUKICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBzdHJfdG9fbG93ZXIpCgpoZWFkKGNhbmR5X2NvbWJpbmVkKQp1bmlxdWUoY2FuZHlfY29tYmluZWQkY291bnRyeSkKY291bnRyeV9kaXN0aW5jdCA8LSBkaXN0aW5jdChjYW5keV9jb21iaW5lZCwgY291bnRyeSkKCmBgYAoKCiMgQ2xlYW5pbmcgY2FuZHkgY29sdW1uCgpgYGB7cn0KY2FuZHlfY29tYmluZWQgPC0gY2FuZHlfY29tYmluZWQgJT4lCiAgbXV0YXRlKGNhbmR5ID0gc3RyX2V4dHJhY3QoY2FuZHksICJbXlxcW1xcXV0rIiksCiAgICAgICAgIGNhbmR5ID0gc3RyX2V4dHJhY3QoY2FuZHksICJbXnE2IHxdK1tefF0rIikpCgpgYGAKCgoKI1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWAoKMS40LjIgQW5hbHlzaXMgcXVlc3Rpb25zCjEuIFdoYXQgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBjYW5keSByYXRpbmdzIGdpdmVuIGFjcm9zcyB0aGUgdGhyZWUgeWVhcnMuIChudW1iZXIgb2YgY2FuZHkgcmF0aW5ncywgbm90IG51bWJlciBvZiByYXRlcnMuIERvbuKAmXQgY291bnQgbWlzc2luZyB2YWx1ZXMpCgpgYGB7cn0KY2FuZHlfY29tYmluZWQgJT4lCiAgZmlsdGVyKCFpcy5uYShyYXRpbmcpKSAlPiUKICBzdW1tYXJpc2UodG90YWxfcmF0aW5nX2NvdW50ID0gbigpKQoKI3RvdGFsX2NhbmR5X3JhdGluZ3MKYGBgCgoKCjIuIFdoYXQgd2FzIHRoZSBhdmVyYWdlIGFnZSBvZiBwZW9wbGUgd2hvIGFyZSBnb2luZyBvdXQgdHJpY2sgb3IgdHJlYXRpbmcgYW5kIHRoZSBhdmVyYWdlIGFnZSBvZiBwZW9wbGUgbm90IGdvaW5nIHRyaWNrIG9yIHRyZWF0aW5nPwoKYGBge3J9CmNhbmR5X2NvbWJpbmVkICU+JQogIHNlbGVjdChnb2luZ19vdXQsIGFnZSkgJT4lCiAgZmlsdGVyKCFpcy5uYShnb2luZ19vdXQpKSAlPiUKICBncm91cF9ieShnb2luZ19vdXQpICU+JQogIHN1bW1hcmlzZShhdmVyYWdlX2FnZSA9IG1lYW4oYWdlKSkKCgoKYGBgCgoKMy4gRm9yIGVhY2ggb2Ygam95LCBkZXNwYWlyIGFuZCBtZWgsIHdoaWNoIGNhbmR5IGJhciByZXZpdmVkIHRoZSBtb3N0IG9mIHRoZXNlIHJhdGluZ3M/CgpgYGB7cn0KY2FuZHlfY29tYmluZWQgJT4lCiAgc2VsZWN0KGNhbmR5LCByYXRpbmcpICU+JQogIGZpbHRlcighaXMubmEocmF0aW5nKSkgJT4lCiAgZ3JvdXBfYnkocmF0aW5nLCBjYW5keSkgJT4lCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUKICBhcnJhbmdlKGRlc2MoY291bnQpKSAlPiUKICBzbGljZShzZXFfbGVuKDEpKQoKCgpgYGAKCmBgYHtyfQpkaXN0aW5jdChjYW5keV9jb21iaW5lZCwgY2FuZHkpCmBgYAoKCjQuIEhvdyBtYW55IHBlb3BsZSByYXRlZCBTdGFyYnVyc3QgYXMgZGVzcGFpcj8KCmBgYHtyfQpjYW5keV9jb21iaW5lZCAlPiUKICBzZWxlY3QoY2FuZHksIHJhdGluZykgJT4lCiAgZmlsdGVyKGNhbmR5ID09ICJzdGFyYnVyc3QiLCByYXRpbmcgPT0gImRlc3BhaXIiKSAlPiUKICBncm91cF9ieShyYXRpbmcpICU+JQogIHN1bW1hcmlzZShzdGFyYnVyc3RfY291bnQgPSBuKCkpICMlPiUKICAjYXJyYW5nZShkZXNjKGNvdW50KSkgIyU+JQogICNzbGljZShzZXFfbGVuKDMpKQpgYGAKCgpGb3IgdGhlIG5leHQgdGhyZWUgcXVlc3Rpb25zLCBjb3VudCBkZXNwYWlyIGFzIC0xLCBqb3kgYXMgKzEgYW5kIG1laCBhcyAwLgoKNS4gV2hhdCB3YXMgdGhlIG1vc3QgcG9wdWxhciBjYW5keSBiYXIgYnkgdGhpcyByYXRpbmcgc3lzdGVtIGZvciBlYWNoIGdlbmRlciBpbiB0aGUgZGF0YXNldD8KCmBgYHtyfQpjYW5keV9jb21iaW5lZCAlPiUKICBzZWxlY3QoZ2VuZGVyLCBjYW5keSwgcmF0aW5nKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJhdGluZykpICU+JQogIG11dGF0ZShuZXdfcmF0aW5nID0gY2FzZV93aGVuKHJhdGluZyA9PSAiZGVzcGFpciIgfiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpbmcgPT0gImpveSIgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGluZyA9PSAibWVoIiB+IDAsKSkgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyLCBjYW5keSkgJT4lCiAgc3VtbWFyaXNlKGNvdW50X3BvcHVsYXIgPSBzdW0obmV3X3JhdGluZykpICU+JQogIGFycmFuZ2UoZGVzYyhjb3VudF9wb3B1bGFyKSkgJT4lCiAgc2xpY2Uoc2VxX2xlbigxKSkKCmBgYAoKCjYuIFdoYXQgd2FzIHRoZSBtb3N0IHBvcHVsYXIgY2FuZHkgYmFyIGluIGVhY2ggeWVhcj8KCmBgYHtyfQpjYW5keV9jb21iaW5lZCAlPiUKICBzZWxlY3QoeWVhciwgY2FuZHksIHJhdGluZykgJT4lCiAgZmlsdGVyKCFpcy5uYShyYXRpbmcpKSAlPiUKICBtdXRhdGUobmV3X3JhdGluZyA9IGNhc2Vfd2hlbihyYXRpbmcgPT0gImRlc3BhaXIiIH4gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW5nID09ICJqb3kiIH4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpbmcgPT0gIm1laCIgfiAwLCkpICU+JQogIGdyb3VwX2J5KHllYXIsIGNhbmR5KSAlPiUKICBzdW1tYXJpc2UocG9wdWxhcl9jYW5keSA9IHN1bShuZXdfcmF0aW5nKSkgJT4lCiAgYXJyYW5nZShkZXNjKHBvcHVsYXJfY2FuZHkpKSAlPiUKICBzbGljZShzZXFfbGVuKDEpKQpgYGAKCgo3LiBXaGF0IHdhcyB0aGUgbW9zdCBwb3B1bGFyIGNhbmR5IGJhciBieSB0aGlzIHJhdGluZyBmb3IgcGVvcGxlIGluIFVTLCBDYW5hZGEsIFVLIGFuZCBhbGwgb3RoZXIgY291bnRyaWVzPwoKCmBgYHtyfQoKYGBgCgoKCgoKCgpURVNUClhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKCgoKYGBge3J9CnNoZWV0M19sb25nICU+JQogIG11dGF0ZShuZXdfY2FuZHkzPSBzdHJfZXh0cmFjdChjYW5keSwgIlteUTYgfF0rW158XSsiKSkKbmV3X2NhbmR5MwpgYGAKCgpgYGB7cn0Kc2hlZXQyX2xvbmcgJT4lCiAgbXV0YXRlKG5ld19jYW5keTIgPSBzdHJfZXh0cmFjdChjYW5keSwgIlteXFxbXFxdXSsiKSkKbmV3X2NhbmR5MgpgYGAKCgo=